package com.shihb.chapter03oop

import com.shihb

/**
 * scala内部类的演示
 */
object Demo11InnerClass {
  def main(args: Array[String]): Unit = {
    //    创建两个外部类实例
    val out1 = new OuterClass
    val out2 = new OuterClass
    // 1、scala创建成员内部类的语法:对象.内部类
    // 可以看出scala内部类和对象相关联
    val inner1 = new out1.InnerClass
    val inner2 = new out2.InnerClass

    inner1.info
    inner2.info2
    //传入自身没问题
    inner1.test(inner1)
    inner2.test(inner2)
    // scala内部类和对象相关联所以这边传入inner2报错
    // 这时候通过类型投影来解决只要传入InnerClass类型的就可以
    inner1.test(inner2)


    // 2、创建静态内部类实例
    val staticInner = new OuterClass.StaticInnerClass


  }

}

//外部类
class OuterClass {
  //这样就取了别名，可以看作是外部类的一个实例
  //需要注意的是属性要在别名之后
  myout =>
  var name = "shb"
  //内部类可以访问私有属性
  private var sal = 14.00
  //成员内部类
  class InnerClass {

    /*
      3、内部类访问外部类属性：
      方式一：外部类名.this.属性名
      OuterClass.this可以理解为这个外部类的实例
      方式二(推荐)：外部类别名.属性名 (别名)
      别名等价OuterClass.this
     */
    def info: Unit = { //方式一
      println("外部类名.this",OuterClass.this.name, OuterClass.this.sal)
    }
    def info2: Unit = { //方式二
      println("别名",myout.name, myout.sal)
    }
    // 可以接收InnerClass实例
    // 类型投影加OuterClass#
    def test(ic:OuterClass#InnerClass): Unit ={
      println(ic)
    }
  }




}

//伴生对象
object OuterClass {


  // 静态内部类
  class StaticInnerClass {

  }

}
